﻿#ifndef PARAMETERTREEMODEL_H
#define PARAMETERTREEMODEL_H

#include <QAbstractItemModel>
#include "common/datatypes.h"

/**
 * @brief TreeNode
 * @details 参数树中的节点数据载体。
 */
struct TreeNode {
    bool isCategory = false;     // 用于判断是否为类型
    ParamTableKind categoryType; // e.g., "AttTable"
    OverviewItem overview;
};

/**
 * @brief 参数表树模型，负责在 UI 中按类型组织参数表概览。
 */
class ParameterTreeModel : public QAbstractItemModel
{
    Q_OBJECT
public:
    /**
     * @brief ParameterTreeModel::ParameterTreeModel
     * @details 构造模型并绑定父对象。
     * @param parent Qt 父对象。
     */
    explicit ParameterTreeModel(QObject *parent = nullptr);
    /**
     * @brief ParameterTreeModel::~ParameterTreeModel
     * @details 释放模型资源。
     */
    ~ParameterTreeModel();

    // --- QAbstractItemModel 虚函数实现 ---
    /**
     * @brief ParameterTreeModel::setData
     * @details 设置节点的显示数据。
     * @param index 目标索引。
     * @param value 需要写入的数据。
     * @param role 角色类型。
     * @return 设置是否成功。
     */
    bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
    /**
     * @brief ParameterTreeModel::data
     * @details 返回指定索引的展示数据。
     * @param index 目标索引。
     * @param role 角色类型。
     * @return 对应数据。
     */
    QVariant data(const QModelIndex &index, int role) const override;
    /**
     * @brief ParameterTreeModel::flags
     * @details 返回指定节点的交互标志。
     * @param index 目标索引。
     * @return Qt 标志集合。
     */
    Qt::ItemFlags flags(const QModelIndex &index) const override;
    /**
     * @brief ParameterTreeModel::headerData
     * @details 返回表头的显示数据。
     * @param section 表头索引。
     * @param orientation 方向。
     * @param role 角色类型。
     * @return 对应数据。
     */
    QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
    /**
     * @brief ParameterTreeModel::index
     * @details 基于父节点创建子索引。
     * @param row 子行号。
     * @param column 子列号。
     * @param parent 父索引。
     * @return 新创建的模型索引。
     */
    QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override;
    /**
     * @brief ParameterTreeModel::parent
     * @details 返回父节点索引。
     * @param index 当前节点索引。
     * @return 父节点索引。
     */
    QModelIndex parent(const QModelIndex &index) const override;
    /**
     * @brief ParameterTreeModel::rowCount
     * @details 返回子节点数量。
     * @param parent 父索引。
     * @return 行数。
     */
    int rowCount(const QModelIndex &parent = QModelIndex()) const override;
    /**
     * @brief ParameterTreeModel::columnCount
     * @details 返回列数。
     * @param parent 父索引。
     * @return 列数。
     */
    int columnCount(const QModelIndex &parent = QModelIndex()) const override;
    /**
     * @brief ParameterTreeModel::hasChildren
     * @details 判断节点是否拥有子节点。
     * @param parent 父索引。
     * @return 是否存在子节点。
     */
    bool hasChildren(const QModelIndex &parent = QModelIndex()) const override;

    /**
     * @brief ParameterTreeModel::getNode
     * @details 从索引中取出对应的节点指针。
     * @param index 目标索引。
     * @return 节点指针。
     */
    TreeNode *getNode(const QModelIndex &index) const;
    /**
     * @brief ParameterTreeModel::addTable
     * @details 按类型插入一个概览表。
     * @param overview 表概览信息。
     * @return 新索引。
     */
    QModelIndex addTable(const OverviewItem &overview);
    /**
     * @brief ParameterTreeModel::getOverview
     * @details 取得指定节点的概览数据。
     * @param index 模型索引。
     * @return 概览对象。
     */
    OverviewItem getOverview(const QModelIndex &index) const;
    /**
     * @brief ParameterTreeModel::findIndexById
     * @details 根据表 ID 和类型定位索引。
     * @param tableId 表标识。
     * @param kind 表类型。
     * @return 匹配索引，未找到时返回无效索引。
     */
    QModelIndex findIndexById(int tableId, ParamTableKind kind);
    /**
     * @brief ParameterTreeModel::findIndexByName
     * @details 根据名称查找索引。
     * @param name 表名称。
     * @return 匹配索引，未找到时返回无效索引。
     */
    QModelIndex findIndexByName(const QString &name);

public slots:
    /**
     * @brief ParameterTreeModel::refresh
     * @details 重新构建模型数据。
     */
    void refresh();

private:
    // 按类型分组存储所有表的数据
    QMap<ParamTableKind, QList<OverviewItem>> m_groupedData;
};

#endif // PARAMETERTREEMODEL_H
